﻿//namespace EFS.RC.CCC.Channels.Context.Operators
//{
//    /// <summary>
//    /// supervisor context channel
//    /// </summary>
//    internal class Supervisor : EFS.RC.Common.AsyncRoot
//    {
//        #region Composition

//        // collaboration channel
//        private Microsoft.Rtc.Collaboration.ConversationContextChannel conversationContextChannel = null;

//        // monitoring session
//        private EFS.RC.CCC.Sessions.Operators.Monitoring.Supervisor supervisorMonitoringSession = null;
		
//        // on context channel messge
//        public delegate void ContextMessageReceived(EFS.RC.CCC.Messages.Message message);

//        // Content message received delegate
//        public ContextMessageReceived OnContextMessageReceived;

//        #endregion

//        #region Usage

//        /// <summary>
//        /// Send data message into the channel
//        /// </summary>
//        /// <param name="message"></param>
//        /// <returns></returns>
//        public System.IAsyncResult BeginDataSend(EFS.RC.CCC.Messages.Message message)
//        {
//            // check
//            EFS.Common.Verify.Reference(message, "message");

//            // begin send context data
//            return conversationContextChannel.BeginSendData(
//                new System.Net.Mime.ContentType(message.ContentType),
//                message.SerializeToByteArray(),
//                EndSendContextData,
//                null);
//        }

//        /// <summary>
//        /// Constructor
//        /// </summary>
//        /// <param name="conversation"></param>
//        /// <param name="remoteEndpoint"></param>
//        public Supervisor(EFS.RC.CCC.Sessions.Operators.Monitoring.Supervisor supervisorMonitoringSession)
//        {
//            // check
//            EFS.Common.Verify.Reference(supervisorMonitoringSession, "supervisorMonitoringSession");

//            // make channel
//            conversationContextChannel = new Microsoft.Rtc.Collaboration.ConversationContextChannel(supervisorMonitoringSession.Conversation, supervisorMonitoringSession.Call.RemoteEndpoint);

//            // log
//            EFS.EventLog.Log.LogInfo("SupervisorContext", this);
//        }

//        /// <summary>
//        /// Describe this object into a nice formated string
//        /// </summary>
//        /// <returns></returns>
//        public override System.String Describe()
//        {
//            return System.String.Format("EFS.RC.CCC.Channels.Context.Operators.Monitoring.Supervisor {0} {1}", conversationContextChannel.Conversation.Endpoint.OwnerUri, conversationContextChannel.RemoteEndpoint.Uri);
//        }

//        /// <summary>
//        /// Begin platform startup
//        /// </summary>
//        public EFS.RC.Common.AsyncProcess BeginStartup()
//        {
//            // log
//            EFS.EventLog.Log.LogInfo("BeginStartup", this);

//            // start end point
//            return BeginAsyncProcess(Startup, OnStartupComplete);
//        }

//        /// <summary>
//        /// Begin platform startup
//        /// </summary>
//        public EFS.RC.Common.AsyncProcess BeginShutdown()
//        {
//            // log
//            EFS.EventLog.Log.LogInfo("BeginStartup", this);

//            // start end point
//            return BeginAsyncProcess(Shutdown, OnShutdownComplete);
//        }

//        #endregion 

//        #region Startup

//        /// <summary>
//        /// Startup
//        /// </summary>
//        private void Startup()
//        {
//            // options
//            Microsoft.Rtc.Collaboration.ConversationContextChannelEstablishOptions conversationContextChannelEstablishOptions = 
//                new Microsoft.Rtc.Collaboration.ConversationContextChannelEstablishOptions();

//            // set toast
//            conversationContextChannelEstablishOptions.Toast = "EFS.RC.CCC.Channels.Context.Operators.Monitoring.Supevisor";

//            // data 
//            conversationContextChannel.DataReceived += DataReceived;

//            // begin
//            conversationContextChannel.BeginEstablish(EFS.RC.CCC.Config.CollabotationPlatofrm.SupervisorCentralApplicationId, conversationContextChannelEstablishOptions, EndEstablisContextChannel, null);
//        }

//        /// <summary>
//        /// Start-up complete
//        /// </summary>
//        /// <param name="ar"></param>
//        private void OnStartupComplete(EFS.RC.Common.AsyncProcess ap)
//        {
//            // log
//            EFS.EventLog.Log.LogInfo("OnStartupComplete", this);

//            try
//            {
//                // check
//                ap.Throw();

//                // log
//                EFS.EventLog.Log.LogInfo("OnStartupComplete SUCCCESS", this);
//            }
//            catch (System.Exception ex)
//            {
//                // log
//                EFS.EventLog.Log.LogException(ex, this);
//            }
//        }

//        /// <summary>
//        /// End establish
//        /// </summary>
//        /// <param name="result"></param>
//        public void EndEstablisContextChannel(System.IAsyncResult ar)
//        {
//            EFS.EventLog.Log.LogInfo("EndEstablisContextChannel", this);

//            try
//            {
//                // try 
//                conversationContextChannel.EndEstablish(ar);

//                // begin send context data
//                conversationContextChannel.BeginSendData(
//                    new System.Net.Mime.ContentType("text/plain"),
//                    System.Text.Encoding.UTF8.GetBytes("anaaremere"),
//                    EndSendContextData,
//                    null);
//            }
//            catch (Microsoft.Rtc.Signaling.RealTimeException rtex)
//            {
//                EFS.EventLog.Log.LogException(rtex, this);
				
//                // shut it down
//                BeginShutdown();
//            }
//        }

//        #endregion

//        #region Runtime

//        /// <summary>
//        /// Data received on channel
//        /// </summary>
//        /// <param name="sender"></param>
//        /// <param name="e"></param>
//        private void DataReceived(object sender, Microsoft.Rtc.Collaboration.ConversationContextChannelDataReceivedEventArgs ea)
//        {
//            try
//            {
//                if (ea.ContentDescription != null)
//                {
//                    System.String asss = System.Text.Encoding.UTF8.GetString(ea.ContentDescription.GetBody());

//                    ProcessSupervisorRequest("");
//                }
//            }
//            catch (System.Exception ex)
//            {
//                // log
//                EFS.EventLog.Log.LogException(ex, this);
//            }
//        }

//        /// <summary>
//        /// Process request
//        /// </summary>
//        /// <param name="supervisorChannelRequest"></param>
//        private void ProcessSupervisorRequest(System.String supervisorChannelRequest)
//        {
//            // start monitoring
//            if (null != OnContextMessageReceived)
//            {
//                OnContextMessageReceived(null);
//            }
//        }

//        /// <summary>
//        /// End data send
//        /// </summary>
//        /// <param name="result"></param>
//        internal void EndSendContextData(System.IAsyncResult result)
//        {
//            // log
//            EFS.EventLog.Log.LogInfo("EndSendContextData", this);

//            try
//            {
//                // check
//                conversationContextChannel.EndSendData(result);

//                // log
//                EFS.EventLog.Log.LogInfo("EndSendContextData SUCCCESS", this);
//            }
//            catch (System.Exception ex)
//            {
//                // log
//                EFS.EventLog.Log.LogException(ex, this);
//            }
//        }

//        #endregion

//        #region Shutdown

//        /// <summary>
//        /// Shut down
//        /// </summary>
//        public void Shutdown()
//        {
//            EFS.EventLog.Log.LogInfo("Shutdown", this);

//            // terninate context channel
//            conversationContextChannel.BeginTerminate(EndTerminateContextChannel, null);
//        }

//                /// <summary>
//        /// Shut down complete
//        /// </summary>
//        /// <param name="ar"></param>
//        private void OnShutdownComplete(EFS.RC.Common.AsyncProcess ap)
//        {
//            // log
//            EFS.EventLog.Log.LogInfo("OnShutdownComplete", this);

//            try
//            {
//                // check
//                ap.Throw();

//                // log
//                EFS.EventLog.Log.LogInfo("OnShutdownComplete SUCCCESS", this);
//            }
//            catch (System.Exception ex)
//            {
//                // log
//                EFS.EventLog.Log.LogException(ex, this);
//            }
//        }

//        /// <summary>
//        ///  End terminate context channel
//        /// </summary>
//        /// <param name="result"></param>
//        public void EndTerminateContextChannel(System.IAsyncResult ar)
//        {
//            EFS.EventLog.Log.LogInfo("EndTerminateContextChannel", this);
			
//            try
//            {
//                // try 
//                conversationContextChannel.EndTerminate(ar);
//            }
//            catch (Microsoft.Rtc.Signaling.RealTimeException rtex)
//            {
//                EFS.EventLog.Log.LogException(rtex, this);
//            }
//        }

//        #endregion
//    }
//}
